\section{Integration continue}
L'intégration continue est un ensemble de pratiques utilisées en génie logiciel consistant à vérifier à chaque modification de code source que le résultat des modifications ne produit pas de régression dans l'application développée.

Pour appliquer cette technique, il faut d'abord que :
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item le code source soit partagé (en utilisant des logiciels de gestion de versions tels que CVS\cite{CVS}, Subversion\cite{Subversion}, git\cite{Git}, etc);
	\item les développeurs intègrent (commit) quotidiennement (au moins) leurs modifications;
	\item des tests d'intégration soient développés pour valider l'application (avec JUnit\cite{JUnit} par exemple).
\end{itemize}
Ensuite, il faut un outil d'intégration continue tel que CruiseControl\cite{CruiseControl}, Hudson\cite{Hudson} ou Jenkins\cite{Jenkins} (anciennement Hudson) pour le langage Java par exemple.
Les principaux avantages d'une telle technique de développement sont :
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item les problèmes d'intégration sont détectés et réparés de façon continue, évitant les problèmes de dernière minute;
	\item prévient rapidement en cas de code incompatible ou manquant;
	\item test immédiat des unités modifiées;
	\item une version est toujours disponible pour test, démonstration ou distribution.
\end{itemize}	
\subsection{phpUnderControl}
L'outil d'intégration continue employé par My C-Sense est phpUnderControl\cite{phpUnderControl} qui s'appuie sur CruiseControl. Le projet phpUnderControl intègre une série d'outils de build et d'exécution d'une suite de tests PHPUnit\cite{PHPUnit} mais également 
des outils d'analyse statique du code comme PHP\_CodeSniffer\cite{PHPCodeSniffer}, PMD\cite{PMD} et PHPDocumentor\cite{PhpDocumentor}. Les résultats des analyses sont exportés sous forme de graphiques \gls{svg}. 
\newline
\indent PHP\_CodeSniffer permet de vérifier que le code respecte les conventions de codage de l'équipe (nombre d'indentations, position des accolades pour les méthodes, conditions, boucles...).

PMD vérifie quant à lui le code source et donne des métriques intéressantes telles que la complexité du code (nombre de "if" imbriqués...) ou le degré de qualité du code en termes de testabilité et de maintenabilité. Il permet aussi de détecter les méthodes dont 
le nom est trop long et trop verbeux, ou bien les méthodes qui sont déclarées mais appelées nulle part dans le code (code mort).

Enfin, PHPDocumentor, automatise la génération de la documentation d'\gls{api}du code source.
\section{Gestionnaire de versions}
Un logiciel de gestion de versions (ou \gls{vcs} en anglais) est un logiciel qui permet de stocker un ensemble de fichiers en conservant la chronologie de toutes les modifications qui ont été effectuées dessus. Il permet notamment de 
retrouver les différentes versions d'un lot de fichiers connexes.

Les logiciels de gestion de versions sont utilisés notamment en ingénierie du logiciel pour conserver le code source relatif aux différentes versions d'un logiciel.
Concrètement, un logiciel de gestion de versions facilite le travail collaboratif. En effet, il permet de travailler à plusieurs sur un même projet (voire sur un même fichier) sans risque de perte de données. Par exemple, sans un logiciel de gestion de versions,
 il peut arriver que l’on écrase les modifications apportées par un tiers. Ce risque est totalement écarté avec un logiciel de gestion de versions car celui-ci fusionnera automatiquement (si possible) les deux fichiers sans les écraser.

C’est d’autant plus intéressant qu’il est également possible de :
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item revenir en arrière (autant de fois que l’on souhaite) sur les fichiers choisis;
	\item gérer plusieurs branches (par exemple une version de développement du site web et la version de production);
	\item trouver qui est l’auteur d’une ligne en particulier, etc.
\end{itemize}
\subsection{SVN}
Subversion, communément appelé SVN, est un des logiciels de gestion de versions les plus utilisés. Il est celui que nous utilisons chez My C-Sense et se base sur le modèle client-serveur, ainsi le dépôt est stocké sur un serveur et chaque développeur ne 
possède qu’une copie de ce dépôt et doit envoyer (svn commit) ses modifications sur le serveur pour qu’elles soient accessibles aux autres.

Il est possible d’utiliser SVN de différentes manières :
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item en ligne de commande ;
	\item via un logiciel client, comme smartSVN (sous Linux, Windows ou Mac) ou TortoiseSVN (sous Windows);
	\item via un éditeur de code avancé, exemple : Eclipse.
\end{itemize}
Le logiciel qu'on utilise chez My C-Sense est TortoiseSVN\cite{TortoiseSVN}, logiciel libre distribué selon les termes de la licence GNU GPL\cite{GnuGpl}.

En s'intégrant dans l'explorateur de Windows, il offre aux utilisateurs de Windows une interface graphique permettant de réaliser la plupart des tâches qu'offre SVN en ligne de commande.

L'explorateur Windows s'enrichit des fonctionnalités suivantes :
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item Superposition d'icône aux répertoires et fichiers permettant de visualiser instantanément l'état (à jour, modifié, en conflit...);
	\item Menu contextuel permettant de committer ou d'updater, à l'échelle d'un fichier, d'une sélection de fichiers ou encore d'un répertoire;
	\item Possibilité d'ajouter en mode détails de l'explorateur des colonnes de type numéro de révision, état.
\end{itemize}
\newpage
\section{Gestion de projet}
Le terme logiciel de gestion de projets peut désigner différents types de logiciel ayant pour objectif de faciliter le travail de gestion de projet. Le travail des logiciels de gestion de projet est généralement d'automatiser des tâches de sauvegarde et/ou de 
la gestion du temps.

Une part importante des logiciels de gestion de projet s'occupe de la planification des projets, c'est-à-dire de l'ordonnancement de tâches en vue de leur réalisation future. Plusieurs méthodes sont utilisées pour ordonnancer les tâches dont :
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item la méthode \gls{pert}\cite{PERT} avec la détermination du chemin critique. Cette méthode n'est plus utilisée de nos jours par les éditeurs de logiciels de planification;
	\item la méthode \gls{pdm}\cite{PDM}. La méthode PDM est utilisée par la plupart des logiciels de planification de projets;
	\item la méthode de la chaîne critique;
	\item les méthodes d'ordonnancement basées sur l'emplacement (pour les travaux dont la productivité chute fortement en cas de coactivité dans une zone).
\end{itemize}

 Une alternative intéressante à ces méthodes classiques existe depuis quelques années: certains logiciels de gestion de projet s'attachent plutôt au suivi des résultats (pilotage par les livrables), afin d'identifier en amont les risques de dérapages 
 (dépassement de budget, de délais...), de manière à sécuriser les projets. 
 Les méthodes utilisées sont principalement:
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item Le suivi opérationnel (à l'aide d'un tableau de bord permettant de comparer l'avancement réel du projet par rapport aux prévisions);
	\item Des outils permettant de "zoomer" pour approfondir l'analyse des données;
	\item L'automatisation des reporting, disponibles en temps réel;
	\item Le partage de l'information entre les collaborateurs, permettant une meilleure synchronisation des acteurs.
\end{itemize}
\subsection{Redmine}
Redmine est une application web libre de gestion complète de projet en mode web, développé en Ruby sur la base du framework Ruby on Rails\cite{Ruby}, qu'on utilise à My C-Sense pour gérer les tâches.

Parmi les fonctionnalités existantes, on trouve:
\begin{itemize}
\renewcommand{\labelitemi}{$\bullet$}
	\item gestion multi-projets;
	\item gestion fine des droits utilisateurs définis par des rôles;
	\item gestion de groupes d'utilisateurs;
	\item rapports de bogues (bugs), demandes d'évolutions;
	\item Wiki multi-projets;
	\item forums multi-projets;
	\item news accessibles par \gls{rss} / ATOM\cite{Atom};
	\item notifications par courriel (mail);
	\item gestion de feuilles de route, GANTT\cite{Gantt}, calendrier;
	\item historique;
	\item intégration avec divers suivis de versions : SVN, CVS, Mercurial, Git, Bazaar \& Darcs;
	\item identification possible via \gls{ldap} et \gls{cas} (à travers un plugin pour ce dernier);
	\item  multilingue (25 langues disponibles pour la 0.7.0);
	\item  support de plusieurs bases de données : MySQL, PostgreSQL ou SQLite.
\end{itemize}

\section{Framework de développement web}
Un Framework de développement web permet d'accélérer le développement d'applications en proposant au développeurs des fonctions, librairies et structures déjà  approuvées. Cela permet de se concentrer sur les fonctionnalités de l'application sans perdre 
de temps à redévelopper les fonctions de plus bas niveau.
\subsection{Zend Framework}
Le Framework web utilisé pendant mon stage est Zend Framework\cite{Zend}, framework libre, orienté objet pour PHP 5 créé en mars 2006 par Zend Technologies. Il est distribué sous la Licence \gls{bsd}. Le Zend Framework, aussi 
nommé ZF, a été développé dans le but de simplifier le développement Web tout en recommandant les bonnes pratiques et la conception orientée objets en offrant des outils aux développeurs. ZF permet aussi d'utiliser nativement le principe de \gls{mvc}, 
mais ne l'oblige pas.
\newline
\indent Dans l'image \ref{fig:zf} on a une représentation visuelle de ZF, version 1.5.
\begin{figure}[h!]
  \centering
	\includegraphics[width=0.7\textwidth]{images/zf}
	\caption{Zend Framework}
  \label{fig:zf}
\end{figure}
\subsubsection{PHP 5}
Le PHP: Hypertext Preprocessor, plus connu sous son sigle PHP, est un langage de scripts libre principalement utilisé pour produire des pages Web dynamiques via un serveur \gls{http}, mais pouvant également fonctionner comme 
n'importe quel langage interprété de façon locale, en exécutant les programmes en ligne de commande. PHP est un langage impératif disposant depuis la version 5 de fonctionnalités de modèle objet complètes. En raison de la richesse de sa bibliothèque, 
on désigne parfois PHP comme une plate-forme plus qu'un simple langage.
Le langage PHP est utilisé principalement en tant que langage de script côté serveur, ce qui veut dire que c'est le serveur (la machine qui héberge la page Web en question) qui va interpréter le code PHP et générer du code (constitué généralement 
d'\gls{xhtml} ou  d'\gls{html}, de \gls{css}, et parfois de JavaScript\cite{JavaScript}) qui pourra être interprété par un 
navigateur. 
Il a été conçu pour permettre la création d'applications dynamiques, le plus souvent dédiées au Web. PHP est très majoritairement installé sur un serveur Apache\cite{Apache}, mais peut être installé sur les autres principaux serveurs HTTP du marche. Ce couplage
 permet de récupérer des informations issues d'une base de données, d'un système de fichiers (contenu de fichiers et de l'arborescence) ou plus simplement des données envoyées par le navigateur afin d'être interprétées ou stockées pour une utilisation ultérieure.
C'est un langage peu typé et souple et donc facile à apprendre par un débutant mais, de ce fait, des failles de sécurité peuvent rapidement apparaître dans les applications. 
Il est multiplate-forme : autant sur Linux qu'avec Windows il permet aisément de reconduire le même code sur un environnement à peu près semblable (prendre en compte les règles d'arborescences de répertoires qui peuvent changer).
Libre, gratuit, simple d'utilisation et d'installation, ce langage nécessite comme tout langage de programmation une bonne compréhension des principales fonctions usuelles ainsi qu'une connaissance aiguë des problèmes de sécurité liés à ce langage.
La version 5.3 a introduit de nombreuses fonctionnalités : les espaces de noms – un élément fondamental de l'élaboration d'extensions, de bibliothèques et de frameworks structurés –, les fonctions anonymes, les fermetures, etc.

\subsubsection{MVC}
Le patron de conception Modèle-vue-contrôleur sépare le modèle de données, l'interface utilisateur et les traitements. Ces trois parties fondamentales se nomment  : le modèle, la vue et le contrôleur.

Le modèle ne s'occupe que du traitements des données, les liens avec la base de données, lecture, insertion, mise-à-jour des tuples dans une base, vérifier que les données sont bien formatées (validation). La présentation des résultats ne se fait pas dans le 
modèle.

La vue correspond à la présentation des résultats, par exemple un tableau HTML, PDF pour un utilisateur ou sous forme XML pour fournir un programme distant. Les évènements et les actions de l'utilisateur (clic d'un bouton, liste de sélection, etc) sont gérés 
dans la vue. Cette séparation permet au graphiste de travailler sans avoir à se soucier des rouages de l'application.

Le contrôleur prend en charge le déroulement du programme. La liste des actions sera dans le contrôleur. Il synchronise les événements provenant de l'utilisateur vers la base de données.
\begin{figure}[h!]
  \centering
  \includegraphics[width=0.7\textwidth]{images/mvc}
  \caption{Modèle-Vue-Contrôleur}
  \label{mvc}
\end{figure}

Zend permet le MVC, tout en conservant les développeurs ne souhaitant pas migrer vers MVC et permet ainsi d'utiliser ZF comme une bibliothèque classique.



